/*
 * @Author       : LuheQiu
 * @Date         : 2021-08-19 13:22:45
 * @LastEditTime : 2021-08-19 13:32:07
 * @LastEditors  : LuheQiu
 * @Description  : 
 * @FilePath     : \master_controller\Hardware\i2c.h
 * HomePage     : https://luheqiu.com
 */
#ifndef __I2C_H
#define __I2C_H

#include "system.h"

//本机七位地址一
#define I2C1_SLAVE_ADDRESS7  0x18
//本机七位地址二
//#define I2C1_SLAVE2_ADDRESS7  0x28

//I2C通讯速率，应当小于400KHz
#define I2C1_Speed           300000

//I2C通讯超时参数
#define LH_I2C_FLAG_TIMEOUT  ((uint32_t)0x1000)
#define LH_I2C_LONG_TIMEOUT  ((uint32_t)(10 * LH_I2C_FLAG_TIMEOUT))

//I2C通讯错误代码
#define ERROR_I2C_TIMEOUT  0x0001


/**
 *@brief: I2C1通讯外设初始化函数
 */
void I2C1_Init(void);


/**
 *@brief: 向 从机寄存器 写数据
 *@param:  I2Cx    设置为I2C1或I2C2来选择I2C外设
 *@param:  address 从机地址
 *@param:  reg     从机寄存器地址
 *@param:  data    写入的数据内容
 */
void LH_I2C_Write(I2C_TypeDef* I2Cx, uint8_t address, uint8_t reg, uint8_t data);

/**
 *@brief: 从 从机寄存器 读取数据
 *@param:  I2Cx    设置为I2C1或I2C2来选择I2C外设
 *@param:  address 从机地址
 *@param:  reg     从机寄存器地址
 *@retval: data    读取到的数据内容
 */
uint8_t LH_I2C_Read (I2C_TypeDef* I2Cx, uint8_t address, uint8_t reg);

/**
 *@brief: 向 从机寄存器 写入数据流
 *@param:  I2Cx    设置为I2C1或I2C2来选择I2C外设
 *@param:  address 从机地址
 *@param:  reg     从机寄存器地址
 *@param:  length  数据流长度
 *@param:  buffer  数据流首地址
 */
void LH_I2C_WriteBuffer(I2C_TypeDef* I2Cx, uint8_t address, uint8_t reg, uint16_t length ,uint8_t* buffer);

/**
 *@brief: 从 从机寄存器 读取数据流
 *@param:  I2Cx    设置为I2C1或I2C2来选择I2C外设
 *@param:  address 从机地址
 *@param:  reg     从机寄存器地址
 *@param:  length  数据流长度
 *@param:  buffer  数据流存储区首地址
 */
void LH_I2C_ReadBuffer(I2C_TypeDef* I2Cx, uint8_t address, uint8_t reg, uint16_t length, uint8_t* buffer);

#endif
